#ifndef STACKLIST_H
#define STACKLIST_H

#include <stdio.h>
#include <stdlib.h>
#include "boolean.h"

/* MODUL STACK */
/* Deklarasi stack yang diimplementasi dengan list linier */
/* dengan representasi fisik pointer */
/* TOP adalah alamat elemen puncak */
#define Nil NULL   /* Nil adalah stack dengan elemen kosong */
/* *** Definisi Type Stack *** */
typedef char infotype;

typedef struct tElmtStack *address;
typedef struct tElmtStack {
	infotype Info;
	address Next;
	} ElmtStack;
	
typedef struct {
	address TOP;
	} Stack;
/* TOP(S) = Nil adalah stack dengan elemen kosong */
/* Definisi stack dengan representasi berkait : */
/* Jika S adalah Stack maka akses elemen : */
/* InfoTop(S) untuk mengakses elemen TOP */
/* TOP(S) adalah alamat elemen TOP */
/* Info(P) untuk mengakses elemen info dengan alamat P */
/* Next(P) untuk mengakses elemen next dengan alamat P */
#define TOP(S) (S).TOP
#define InfoTop(S) ((S).TOP)->Info
#define Info(P) (P)->Info
#define Next(P) (P)->Next

/* ********* Prototype ********* */
/* *** Konstruktor/Kreator *** */
void CreateEmpty (Stack *S);
/* I.S. Sembarang */
/* F.S. Membuat sebuah stack S yang kosong berkapasitas MaxEl */
/* jadi indeksnya antara 1..MaxEl */
/* Ciri stack kosong : TOP bernilai Nil */

/* *** Prototype manajemen memori *** */
void Alokasi (address *P, infotype X);
/* I.S. P Sembarang, X terdefinisi */
/* F.S. Alamat P dialokasi, jika berhasil maka Info(P) = X dan Next(P) = Nil */
/*      P = Nil jika alokasi gagal */

void Dealokasi (address *P);
/* I.S. P adalah hasil alokasi, P <> Nil */
/* F.S. Alamat P didealokasi, dikembalikan ke sistem */

/* ********* Predikat Untuk test keadaan KOLEKSI ********* */
boolean IsEmpty (Stack S);
/* Mengirim true jika Stack kosong : lihat definisi di atas */

/* ********** Operator Dasar Stack ********* */
void Push (Stack *S, infotype X);
/* Menambahkan X sebagai elemen Stack S. */
/* I.S. S mungkin kosong, tabel penampung elemen stack TIDAK penuh */
/* F.S. X menjadi TOP yang baru, jika alokasi elemen baru berhasil. */
/*      Jika alokasi gagal, S tetap. */

void Pop (Stack *S, infotype *X);
/* Menghapus X dari Stack S. */
/* I.S. S tidak kosong */
/* F.S. X adalah nilai elemen TOP yang lama, elemen top yang lama didealokasi,
TOP(S) = Next(TOP(S)). */

void DeleteStack (Stack * s);

void CopyStack (Stack * s1,Stack s2);

boolean IsSameStack (Stack s1, Stack s2);

void PrintStack (Stack s);

#endif